package org.wojtas.kontroler;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import org.wojtas.model.Opinia;
import org.wojtas.model.Uzytkownik;
import org.wojtas.model.Zamowienie;
import org.wojtas.model.ZamowienieStatus;
import org.wojtas.ustawienia.Ustawienia;
import org.wojtas.ustawienia.baza.PolaczenieZBaza;

public class ZapisOdczytBazaDanych {
	public static Uzytkownik pobierzUzytkownika(String login, String haslo) {
		Connection conn;
		String zapytanie = "SELECT * FROM uzytkownicy WHERE login = ? AND haslo = ?;";
		Uzytkownik u = null;

		try {
			conn = PolaczenieZBaza.pobierzPolaczenie();
			PreparedStatement ps = conn.prepareStatement(zapytanie);
			ps.setString(1, login);
			ps.setString(2, haslo);
			ResultSet rs = ps.executeQuery();

			if (rs.next()) {
				u = Uzytkownik.pobierzZRS(rs);
			}
			rs.close();
			ps.close();
		} catch (SQLException e) {
			Ustawienia.log(e);
		}
		return u;
	}

	public static ArrayList<Uzytkownik> pobierzUzytkownikow() {
		ArrayList<Uzytkownik> uzytkownicy = new ArrayList<Uzytkownik>();

		Connection conn;
		String zapytanie = "SELECT * FROM uzytkownicy ORDER BY id;";

		try {
			conn = PolaczenieZBaza.pobierzPolaczenie();
			PreparedStatement ps = conn.prepareStatement(zapytanie);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				Uzytkownik u = Uzytkownik.pobierzZRS(rs);
				uzytkownicy.add(u);
			}
			rs.close();
			ps.close();

			return uzytkownicy;
		} catch (SQLException e) {
			Ustawienia.log(e);
		}
		return null;
	}

	public static boolean zapiszUzytkownika(Uzytkownik u) {
		try {
			String zapytanie = "INSERT INTO uzytkownicy (login, haslo, imie, nazwisko, adres) VALUES (?, ?, ?, ?, ?);";
			Connection conn = PolaczenieZBaza.pobierzPolaczenie();
			PreparedStatement ps = conn.prepareStatement(zapytanie);
			ps.setString(1, u.getLogin());
			ps.setString(2, u.getHaslo());
			ps.setString(3, u.getImie());
			ps.setString(4, u.getNazwisko());
			ps.setString(5, u.getAdres());
			int ileWierszy = ps.executeUpdate();
			ps.close();
			return ileWierszy == 1;
		} catch (SQLException e) {
			Ustawienia.log(e);
		}
		return false;
	}
	
	public static Zamowienie pobierzZamowienieDlaUzytkownika(int idUzytkownika) {
		Connection conn;
		String zapytanie = "SELECT * FROM zamowienia WHERE id_uzytkownika = ?;";
		Zamowienie z = null;

		try {
			conn = PolaczenieZBaza.pobierzPolaczenie();
			PreparedStatement ps = conn.prepareStatement(zapytanie);
			ps.setInt(1, idUzytkownika);
			ResultSet rs = ps.executeQuery();

			if (rs.next()) {
				z = Zamowienie.pobierzZRS(rs);
			}
			rs.close();
			ps.close();
		} catch (SQLException e) {
			Ustawienia.log(e);
		}
		return z;
	}
	
	public static ArrayList<Zamowienie> pobierzZamowienia() {
		ArrayList<Zamowienie> uzytkownicy = new ArrayList<Zamowienie>();

		Connection conn;
		String zapytanie = "SELECT * FROM zamowienia ORDER BY id;";

		try {
			conn = PolaczenieZBaza.pobierzPolaczenie();
			PreparedStatement ps = conn.prepareStatement(zapytanie);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				Zamowienie z = Zamowienie.pobierzZRS(rs);
				uzytkownicy.add(z);
			}
			rs.close();
			ps.close();

			return uzytkownicy;
		} catch (SQLException e) {
			Ustawienia.log(e);
		}
		return null;
	}
	
	public static boolean zapiszZamowienie(Zamowienie z) {
		try {
			String zapytanie = "INSERT INTO zamowienia (id_uzytkownika, id_statusu) VALUES (?, ?);";
			Connection conn = PolaczenieZBaza.pobierzPolaczenie();
			PreparedStatement ps = conn.prepareStatement(zapytanie);
			ps.setInt(1, z.getIdUzytkownika());
			ps.setInt(2, z.getStatus().getKod());
			int ileWierszy = ps.executeUpdate();
			ps.close();
			return ileWierszy == 1;
		} catch (SQLException e) {
			Ustawienia.log(e);
		}
		return false;
	}
	
	public static boolean usunZamowienie(Integer idZamowienia) {
		try {
			String zapytanie = "DELETE FROM zamowienia WHERE id = ?;";
			Connection conn = PolaczenieZBaza.pobierzPolaczenie();
			PreparedStatement ps = conn.prepareStatement(zapytanie);
			ps.setInt(1, idZamowienia);
			int ileWierszy = ps.executeUpdate();
			ps.close();
			return ileWierszy == 1;
		} catch (SQLException e) {
			Ustawienia.log(e);
		}
		return false;
	}
	
	public static boolean zmienZamowienie(int idZamowienia, ZamowienieStatus status) {
		try {
			String zapytanie = "UPDATE zamowienia SET id_statusu = ? WHERE id = ?;";
			Connection conn = PolaczenieZBaza.pobierzPolaczenie();
			PreparedStatement ps = conn.prepareStatement(zapytanie);
			ps.setInt(1, status.getKod());
			ps.setInt(2, idZamowienia);
			int ileWierszy = ps.executeUpdate();
			ps.close();
			return ileWierszy == 1;
		} catch (SQLException e) {
			Ustawienia.log(e);
		}
		return false;
	}
	
	public static boolean zapiszOpinie(Opinia o) {
		try {
			String zapytanie = "INSERT INTO opinie (id_zamowienia, tresc) VALUES (?, ?);";
			Connection conn = PolaczenieZBaza.pobierzPolaczenie();
			PreparedStatement ps = conn.prepareStatement(zapytanie);
			ps.setInt(1, o.getIdZamowienia());
			ps.setString(2, o.getTresc());
			int ileWierszy = ps.executeUpdate();
			ps.close();
			return ileWierszy == 1;
		} catch (SQLException e) {
			Ustawienia.log(e);
		}
		return false;
	}
	
	public static Opinia pobierzOpinie(int idZamowienia) {
		Connection conn;
		String zapytanie = "SELECT * FROM opinie WHERE id_zamowienia = ?;";
		Opinia o = null;

		try {
			conn = PolaczenieZBaza.pobierzPolaczenie();
			PreparedStatement ps = conn.prepareStatement(zapytanie);
			ps.setInt(1, idZamowienia);
			ResultSet rs = ps.executeQuery();

			if (rs.next()) {
				o = Opinia.pobierzZRS(rs);
			}
			rs.close();
			ps.close();
		} catch (SQLException e) {
			Ustawienia.log(e);
		}
		return o;
	}
	
	public static boolean usunUzytkownika(int idUzytkownika) {
		try {
			String zapytanie = "DELETE FROM uzytkownicy WHERE id = ? AND rola != 0;";
			Connection conn = PolaczenieZBaza.pobierzPolaczenie();
			PreparedStatement ps = conn.prepareStatement(zapytanie);
			ps.setInt(1, idUzytkownika);
			int ileWierszy = ps.executeUpdate();
			ps.close();
			return ileWierszy == 1;
		} catch (SQLException e) {
			Ustawienia.log(e);
		}
		return false;
	}

	public static ArrayList<Opinia> pobierzOpinie() {
		ArrayList<Opinia> opinie = new ArrayList<Opinia>();

		Connection conn;
		String zapytanie = "SELECT * FROM opinie ORDER BY id;";

		try {
			conn = PolaczenieZBaza.pobierzPolaczenie();
			PreparedStatement ps = conn.prepareStatement(zapytanie);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				Opinia o = Opinia.pobierzZRS(rs);
				opinie.add(o);
			}
			rs.close();
			ps.close();

			return opinie;
		} catch (SQLException e) {
			Ustawienia.log(e);
		}
		return null;
	}

	public static boolean usunOpinie(Integer idOpinii) {
		try {
			String zapytanie = "DELETE FROM opinie WHERE id = ?;";
			Connection conn = PolaczenieZBaza.pobierzPolaczenie();
			PreparedStatement ps = conn.prepareStatement(zapytanie);
			ps.setInt(1, idOpinii);
			int ileWierszy = ps.executeUpdate();
			ps.close();
			return ileWierszy == 1;
		} catch (SQLException e) {
			Ustawienia.log(e);
		}
		return false;
	}
}
